package com.unitd.filesystem.provider;

import com.unitd.filesystem.utils.HttpDownloadHelper;
import com.unitd.filesystem.utils.HttpFilePathHelper;
import com.unitd.frame.comm.exception.FileSystemException;

/**
 * @desc 文件系统上传、下载抽象类，用于抽取实现IFSProvider后，都需要实现的方法
 * @filename AbstractProvider.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017/3/6
 */
public abstract class AbstractProvider implements IFsProvider {

	/** 默认的文件路径分割符 */
	protected static final String DIR_SPLITER = "/";

	/** 文件的URL路径前缀 */
	protected String urlprefix;
	/** 文件系统的所属空间名 */
	protected String bucketName;

	/**
	 * @desc 根据文件名称获取文件路径
	 * @param fileName 指定的文件
	 * @return String
	 */
	@Override
	public String getPath(String fileName) {
		try {
			String url = getFullPath(fileName);
			if (HttpDownloadHelper.read(url) == null) {
				throw new FileSystemException(name(), "文件不存在");
			}
			return url;
		} catch (Exception e) {
			throw new FileSystemException(name(), e);
		}
	}

	/**
	 * @desc 根据文件名称获取文件全路径
	 * @param fileName 指定的文件
	 * @return String
	 */
	protected String getFullPath(String fileName) {
		if(fileName.startsWith(HttpFilePathHelper.HTTP_PREFIX) || fileName.startsWith(HttpFilePathHelper.HTTPS_PREFIX)){
			return fileName;
		}
		return urlprefix + fileName;
	}

	/**
	 * @desc 定义的抽象方法,用于获取使用的第三方的分布式文件系统的名称(比如: fastDFS、qiniu等)
	 * @return String
	 */
	public abstract String name();

	/**
	 * @desc 抛出异常
	 * @param e 异常
	 */
	protected void processException(Exception e) {
		throw new FileSystemException(name(),e);
	}
}